package xing.infrastructure.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.misc.BASE64Decoder;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

/********************************
 * 文 件 名 :GenerateImage.java
 * 创 建 人：陈天龙
 * 日    期：2017/8/9
 * 描   述：图片工具类
 * 版 本 号：v1.0.0
 ********************************/
public class GenerateImage {

    private static final Logger logger = LoggerFactory.getLogger(GenerateImage.class);

    /**
     * 描   述：以base64编码解析图片并保存
     * 创 建 人：陈天龙
     * 日    期：2017/8/9
     * @param imageFile base64字符串
     * @param upload_path 上传路径
     * @param imageName 图片名
     * @return 图片保存地址
     */
    public static String base64Generate(String imageFile,String upload_path,StringBuffer imageName) throws Exception{
        // 通过base64来转化图片
        if(imageFile.indexOf("jpeg")>0) {
            imageFile = imageFile.replaceAll("data:image/jpeg;base64,", "");
            imageName.append(".jpeg");
        } else if(imageFile.indexOf("png")>0) {
            imageFile = imageFile.replaceAll("data:image/png;base64,", "");
            imageName.append(".png");
        } else if(imageFile.indexOf("jpg")>0) {
            imageFile = imageFile.replaceAll("data:image/jpg;base64,", "");
            imageName.append(".jpg");
        }
        BASE64Decoder decoder = new BASE64Decoder();
        // Base64解码
        byte[] imageByte = null;
        imageByte = decoder.decodeBuffer(imageFile);
        for (int i = 0; i < imageByte.length; ++i) {
            if (imageByte[i] < 0) {// 调整异常数据
                imageByte[i] += 256;
            }
        }
        // 生成文件路径
        StringBuffer imagePath = new StringBuffer();
        imagePath.append(upload_path).append(imageName);
        //创建目录
        File dirname = new File(upload_path);
        if(!dirname.isDirectory()){
            dirname.mkdir();
        }
        // 生成文件
        String filename = new String(imagePath);
        File image = new File(filename);
        image.createNewFile();
        if(!image.exists()){
            image.createNewFile();
        }
        OutputStream imageStream = new FileOutputStream(image);
        imageStream.write(imageByte);
        imageStream.flush();
        imageStream.close();
        return filename;
    }

    /**
     * 描   述：下载图片并保存到本地
     * 创 建 人：陈天龙
     * 日    期：2017/9/2
     * @param urlString 下载地址
     * @param upload_path 上传路径
     * @param imageName 图片名
     * @return 图片保存地址
     */
    public static String download(String urlString, String imageName,String upload_path) throws Exception{
        //构造URL
        URL url = new URL(urlString);
        //打开连接
        URLConnection con = url.openConnection();
        //设置请求超时为5s
        con.setConnectTimeout(5*1000);
        //输入流
        InputStream is = con.getInputStream();

        //1K的数据缓冲
        byte[] bs = new byte[1024];
        //读取到的数据长度
        int len;
        //输出的文件流
        File sf = new File(upload_path);
        if(!sf.exists()){
            sf.mkdirs();
        }
        String filename = upload_path + File.separator+imageName;
        delImage(filename);
        OutputStream os = new FileOutputStream(filename);
        //开始读取
        while ((len = is.read(bs)) != -1) {
            os.write(bs, 0, len);
        }
        //完毕，关闭所有链接
        os.close();
        is.close();
        return filename;
    }

    public static void delImage(String filename){
        try {
            File file = new File(filename);
            if(file.exists()){
                file.delete();
            }
        } catch (Exception e) {
            logger.error("删除图片失败",e);
        }
    }
}
